Multithreaded programs, even if given the exact same input, may not produce the same output due to a variety of factors such as timing differences, inter-thread communication, and/or the like. Such nondeterminism in systems with multiple execution pipelines may severely complicate testing, debugging, and deployment of multithreaded programs. For example, even if a bug can be identified, it may be difficult to reproduce the buggy behavior if the behavior only occurs intermittently. As another example, there are no guarantees that a nondeterministic multithreaded program will perform the same way as tested once it is deployed.
While some attempts have been made to produce systems that execute multithreaded programs in a deterministic manner, each of the prior systems have shortcomings. In some previous attempts, speculation schemes are required, which add a great deal of complexity to the hardware required for implementation. In other previous attempts, multiple threads have been serialized, which has a negative effect on performance. What is needed are systems and methods for deterministic execution of multithreaded programs that have low hardware complexity yet are able to provide highly efficient performance.